package com.wei.czz.framework.admin.controller;

import com.wei.czz.common.annotation.Auth;
import com.wei.czz.common.annotation.Resubmit;
import com.wei.czz.common.dto.admin.userRisk.UserRiskDto;
import com.wei.czz.common.dto.admin.userRisk.UserRiskEnumDto;
import com.wei.czz.common.dto.admin.userRisk.UserRiskFlowDto;
import com.wei.czz.common.enums.admin.user.UserAppealEnum;
import com.wei.czz.common.jsr303.group.OrderSearch;
import com.wei.czz.common.jsr303.group.Save;
import com.wei.czz.common.jsr303.group.Update;
import com.wei.czz.common.tool.PageDto;
import com.wei.czz.common.tool.Result;
import com.wei.czz.common.vo.admin.AuditUserRiskVo;
import com.wei.czz.common.vo.admin.UserRiskVo;
import com.wei.czz.common.vo.admin.userRisk.UserRiskFormVo;
import com.wei.czz.framework.admin.manager.UserRiskManager;
import com.wei.czz.framework.admin.service.UserAppealService;
import com.wei.czz.framework.admin.service.UserRiskFlowService;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

/**
 * Created by IntelliJ IDEA.
 *
 * @author wei
 * date: 2022-04-15 21:40:39
 * className: UserRiskFlowController 用户风控记录请求接口类
 * version: 1.0
 * description:
 */
@RestController
@RequestMapping("/sys/user-risk")
@AllArgsConstructor
public class UserRiskFlowController {

    private static final Logger log = LoggerFactory.getLogger(UserRiskFlowController.class);

    private final UserRiskFlowService userRiskFlowService;

    private final UserAppealService userAppealService;

    private final UserRiskManager userRiskManager;

    /**
     * 保存用户风控信息接口
     * 1、保存用户风控信息
     * 2、修改用户状态及删除相关缓存
     * 3、用户无法禁用自己
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页面-用户管理页面-用户风控操作弹出框中调用
     * <p>
     * 此接口会校验是否重复提交
     * @param userRiskVo 用户风控请求参数对象
     * @return 请求结果
     */
    @Resubmit(message = "禁用用户")
    @PostMapping("/save")
    @Auth(permit = "user:risk:opt")
    public Result<Object> saveUserRisk(@Validated(Save.class) @RequestBody UserRiskVo userRiskVo) {
        log.info("开始保存用户风控信息业务。{}", userRiskVo);

        userRiskManager.saveUserRisk(userRiskVo);

        log.info("保存用户风控信息业务结束");
        return Result.success();
    }

    /**
     * 分页查询用户风控记录列表接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页面-用户风控管理页面中调用
     * @param userRiskFormVo 用户风控记录参数对象
     * @return 用户风控记录分页数据
     */
    @Resubmit(spEL = "'getUserRiskPageList' + #userPo.userId + '-' + #userRiskFormVo")
    @PostMapping("/page/list")
    @Auth(permit = "user:risk:list")
    public Result<PageDto<UserRiskFlowDto>> getUserRiskPageList(
            @Validated(OrderSearch.class) @RequestBody UserRiskFormVo userRiskFormVo) {
        log.info("开始分页查询用户风控记录列表业务。{}", userRiskFormVo);

        if (ObjectUtils.allNotNull(userRiskFormVo.getStartCreateTime(), userRiskFormVo.getEndCreateTime())
                && userRiskFormVo.getStartCreateTime().compareTo(userRiskFormVo.getEndCreateTime()) > 0) {
            log.info("分页查询用户风控记录列表接口，时间范围参数错误");
            return Result.paramFail();
        }

        PageDto<UserRiskFlowDto> pageDto = userRiskManager.getUserRiskPageList(userRiskFormVo);

        log.info("分页查询用户风控记录列表业务结束");
        return Result.success(pageDto);
    }

    /**
     * 获取用户风控信息接口
     * 根据用户id，获取用户最新一条风控信息
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页面-用户管理页面-用户风控操作弹出框中调用
     *
     * @param userId 用户id
     * @return 请求结果
     */
    @GetMapping("/get")
    @Auth(permit = "user:risk:opt")
    public Result<UserRiskDto> getRisk(@RequestParam("userId") Long userId) {
        log.info("开始获取用户风控信息业务。userId={}", userId);

        UserRiskDto userRiskDto = userRiskManager.getLastRisk(userId);

        log.info("获取用户风控信息业务结束");
        return Result.success(userRiskDto);
    }

    /**
     * 获取用户风控枚举数据接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页面-用户风控管理页面中调用
     * @return 请求结果
     */
    @GetMapping("/page/enum")
    @Auth(permit = "user:risk:list")
    public Result<UserRiskEnumDto> getEnums() {
        log.info("开始获取用户风控枚举数据业务");

        UserRiskEnumDto userRiskEnumDto = userRiskManager.getEnums();

        log.info("获取用户风控枚举数据业务结束。{}", userRiskEnumDto);
        return Result.success(userRiskEnumDto);
    }

    /**
     * 校验用户风控记录接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页面-用户风控管理页面中调用
     * @param id 用户风控记录主键
     * @return 用户申诉数据
     */
    @GetMapping("/check")
    @Auth(permit = "user:risk:get")
    public Result<Object> checkUserRisk(@RequestParam("id") Long id) {
        log.info("开始校验用户风控记录业务。riskRecordId={}", id);

        userRiskManager.checkUserRisk(id);

        log.info("校验用户风控记录业务结束");
        return Result.success();
    }

    /**
     * 取消用户风控接口
     * 1、修改用户风控信息
     * 2、修改用户状态及删除相关缓存
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页面-用户管理页面-用户风控操作弹出框中调用
     * <p>
     * 此接口会校验是否重复提交
     * @param userRiskVo 用户风控请求参数对象
     * @return 请求结果
     */
    @Resubmit(message = "用户解禁")
    @RequestMapping("/cancel")
    @Auth(permit = "user:risk:opt")
    public Result<Object> cancelUserRisk(@Validated(Update.class) @RequestBody UserRiskVo userRiskVo) {
        log.info("开始取消用户风控信息业务。{}", userRiskVo);

        userRiskManager.cancelUserRisk(userRiskVo.getId(), userRiskVo.getUserId(), userRiskVo.getWord());

        log.info("取消用户风控信息业务结束");
        return Result.success();
    }

    /**
     * 用户申诉审核提交接口
     * @param auditUserRiskVo 审核结果参数对象
     * @return 不返回数据
     */
    @Resubmit(message = "用户申诉审核")
    @PostMapping("/audit")
    @Auth(permit = "opt:user:risk")
    public Result<Object> auditUserRisk(@Validated @RequestBody AuditUserRiskVo auditUserRiskVo) {
        log.info("开始用户申诉审核业务。{}", auditUserRiskVo);

        boolean bool = UserAppealEnum.PASS_STATUS.getValue().equals(auditUserRiskVo.getAuditStatus());
        bool = bool || UserAppealEnum.REJECT_STATUS.getValue().equals(auditUserRiskVo.getAuditStatus());
        if (!bool) {
            log.info("用户申诉审核提交接口，审核状态参数错误");
            return Result.paramFail();
        }
        if (UserAppealEnum.REJECT_STATUS.getValue().equals(auditUserRiskVo.getAuditStatus())
                && StringUtils.isBlank(auditUserRiskVo.getAuditDesc())) {
            log.info("用户申诉审核提交接口，审核拒绝，审核回复状态参数错误");
            return Result.paramFail();
        }

        userRiskManager.auditUserRisk(auditUserRiskVo);

        log.info("用户申诉审核业务结束");
        return Result.success();
    }

}
